<!DOCTYPE html>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1" />
<html>
<head>
    <meta charset="UTF-8">
    <meta name="theme-color" content="#4b75ff">
    <title>Photo Viewer</title>
    <script src="../script/jquery.min.js"></script>
    <script src="../script/ao_module.js"></script>
    <script src="constants.js"></script>
    <link rel="manifest" href="manifest.json">
    <style>
        body{
            margin: 0px !important;
            background:rgba(34,34,34,1);
            overflow: hidden;
        }
        .arrow{
            width: 2em;
            opacity: 0.5;
            position: fixed;
            top: calc(50% - 1em);
            cursor: pointer;
        }

        .left.arrow{
            left: 2em;
        }

        .right.arrow{
            right: 2em;
        }

        .zoom{
            width: 2em;
            opacity: 0.5;
            position: fixed;
            bottom: 1em;
            cursor: pointer;
        }

        .zoom.out{
            right: 1em;
        }

        .zoom.in{
            right: 3.2em;
        }

        #img{
            transition: transform 0.5s;
        }

        .print{
            width: 2em;
            opacity: 0.5;
            position: fixed;
            bottom: 1em;
            cursor: pointer;
            left: 1em;
        }
    </style>
</head>
<body>
    <img id="img" style="max-height: 100vh;max-width: 100%;">
    <img class="left arrow" style="display:none;" onclick="previousImage();" src="embedded/arrow-left.svg">
    <img class="right arrow" style="display:none;" onclick="nextImage();" src="embedded/arrow-right.svg">
    <img class="zoom in" onclick="zoomIn();" src="embedded/zoom-in.svg">
    <img class="zoom out" onclick="zoomOut();" src="embedded/zoom-out.svg">
    <img class="print" onclick="PrintImage();" src="embedded/print.svg">
    <script>
        //Get file playback info from hash
        var playbackFile = ao_module_loadInputFiles();
        var nearbyFileList = [];
        var currentImageURL = "";
        var currentImageFilename = "";
        var currentViewingIndex = 0;
        var zoomLevel = 1;
        var initMargin = [];
        var currentMargin = [];

        //Only handle one file
        playbackFile = playbackFile[0];
        loadImage(playbackFile.filename, playbackFile.filepath);
        
        $(window).on("resize ", function() {
            updateImgSize();
        });

        /*
            Zooming related functions
        */

        function zoomIn(){
            zoomLevel+= 0.5;
            if (zoomLevel >=3){
                zoomLevel = 3;
            }
            applyZoom();
        }

        function zoomOut(){
            zoomLevel-= 0.5;
            applyZoom();
        }

        $(window).bind('mousewheel DOMMouseScroll', function(event){
            //Get the percentage of offsets from the cursor position to the photo edge
           
            
            if (event.originalEvent.wheelDelta > 0 || event.originalEvent.detail < 0) {
                // scroll up
                zoomIn();
            }
            else {
                // scroll down
                zoomOut();
            }
        });

        function applyZoom(){
            if (zoomLevel < 1){
                zoomLevel = 1;
            }

            if (zoomLevel == 1){
                //Reset offsets
                updateImgSize();
            }

            $("#img").css("transform", `scale(${zoomLevel})`);
        }

        //Event binding for photo draging
        var isDragging = false;
        var initPositions = [];
        $(window).mousedown(function(evt) {
            evt.preventDefault();
            handleZoomMousedown(evt.clientX, evt.clientY);
        });

        $(window).mousemove(function(evt) {
            handleZoomMouseMove(evt.clientX, evt.clientY);
        });

        $(window).mouseup(function() {
            handleZoomMouseUp();
        });

        function getCurrentImageMargins(){
            var accLeft = $("#img").css("margin-left").replace("px","");
            var accTop = $("#img").css("margin-top").replace("px","");
            return [parseFloat(accLeft), parseFloat(accTop)];
        }

        function handleZoomMousedown(x,y){
            if (zoomLevel > 1){
                //Only allow dragging when zoomlv > 1
                isDragging = true;
                var accLeft = $("#img").css("margin-left").replace("px","");
                var accTop = $("#img").css("margin-top").replace("px","");
                initPositions = [JSON.parse(JSON.stringify(x - accLeft)), JSON.parse(JSON.stringify(y - accTop))];
            }
        }

        function handleZoomMouseMove(x,y){
            if (isDragging){
                console.log("dragging");
                var offsetsToStartPoint = [initPositions[0] - x, initPositions[1] - y];
                MoveImage(-offsetsToStartPoint[0], -offsetsToStartPoint[1]);
            }
        }

        function MoveImage(x,y){
            $("#img").css("margin-left",  x + "px");
            $("#img").css("margin-top", y + "px");
        }

        function handleZoomMouseUp(){
            isDragging = false;
        }

        /*
            Printing related
        */

        function ImagetoPrint(source, title=""){
            return `<html>
                <head>
                    <title>${title}</title>
                    <${"script"}>
                        function pre(){
                            setTimeout('startprint()', 10);
                        }
                        
                        function startprint(){
                            window.print();
                            window.close();
                        }
                    </${"script"}>
                </head>
                <body onload="pre()">
                    <img style="max-width: 100%; max-height: 100%;" src='${source}' />
                </body>
            </html>`;
        }

        function PrintImage(){
            var Pagelink = "about:blank";
            var pwa = window.open(Pagelink, "_new");
            pwa.document.open();
            pwa.document.write(ImagetoPrint(currentImageURL, currentImageFilename));
            pwa.document.close();
        }


        //Load the nearby image files and allow swapping using <- and -> key
        function loadNearbyFiles(filepath){
            ao_module_agirun("Photo/embedded/listNearbyImage.js", {
                path: filepath
            }, function(data){
                if (data.error != undefined){
                    alert(data.error);
                }else{
                    nearbyFileList = data;
                    $(".arrow").css("display", "");
                    //Track which index currently the user is viewing
                    for (var i = 0; i < nearbyFileList.length; i++){
                        var thisPath = nearbyFileList[i];
                        if (thisPath == filepath.split("\\").join("/")){
                            currentViewingIndex = i;
                        }
                    }
                }
            })
        }

        function nextImage(){
            nextPhoto = currentViewingIndex + 1;
            if (nextPhoto > nearbyFileList.length - 1){
                nextPhoto = nearbyFileList.length - 1;
            }

            var filepath = nearbyFileList[nextPhoto];
            var filename = filepath.split('/').pop();
            if (nextPhoto != currentViewingIndex){
                //Change in photo index
                loadImage(filename, filepath);
                 currentViewingIndex = nextPhoto;
            }
        }

        function previousImage(){
            nextPhoto = currentViewingIndex - 1;
            if (nextPhoto < 0){
                nextPhoto = 0;
            }

            var filepath = nearbyFileList[nextPhoto];
            var filename = filepath.split('/').pop();
            if (nextPhoto != currentViewingIndex){
                //Change in photo index
                loadImage(filename, filepath);
                 currentViewingIndex = nextPhoto;
            }
        }

        //Bind arrow key events
        $("body").on("keydown", function(e){
            var nextPhoto = currentViewingIndex;
            if (e.keyCode == 37){
                //<-
                if (nearbyFileList.length > 0){
                    previousImage();
                }
            }else if (e.keyCode == 39){
                //->
                if (nearbyFileList.length > 0){
                    nextImage();
                }
            }else{
                //Invalid keycode to operate
                return;
            }
        })

        loadNearbyFiles(playbackFile.filepath);

        async function loadImage(filename, filepath){
            $("#img").hide();
            ao_module_setWindowTitle("Photo - " + filename);

            // Backend handles RAW files automatically
            $("#img").attr("src", '../media?file=' + encodeURIComponent(filepath));
            currentImageURL = '../media?file=' + encodeURIComponent(filepath);

            currentImageFilename = filename;
            //realigin to center
            $('#img').on('load', function() {
                zoomLevel = 1;
                applyZoom();
                updateImgSize();
                $("#img").show();
            });
        }

        function updateImgSize() {
            $('#img').css("margin-top", (window.innerHeight - $("#img").height()) / 2);
            $('#img').css("margin-left", (window.innerWidth - $("#img").width()) / 2);
            initMargin = [(window.innerWidth - $("#img").width()) / 2, (window.innerHeight - $("#img").height()) / 2];
            currentMargin = initMargin;
        }

        //Touch gesture detections
        document.addEventListener('touchstart', handleTouchStart, false);        
        document.addEventListener('touchmove', handleTouchMove, false);

        var xDown = null;                                                        
        var yDown = null;

        function getTouches(evt) {
        return evt.touches ||             // browser API
                evt.originalEvent.touches; // jQuery
        }                                                     
        
        function handleTouchStart(evt) {
            const firstTouch = getTouches(evt)[0];                                      
            xDown = firstTouch.clientX;
            yDown = firstTouch.clientY;
        };


        function handleTouchMove(evt) {
            if ( ! xDown || ! yDown ) {
                return;
            }

            var xUp = evt.touches[0].clientX;                                    
            var yUp = evt.touches[0].clientY;

            var imgmg = getCurrentImageMargins();
            var xDiff = xDown - xUp;
            var xDiffAcc = xDiff - imgmg[0];
            var yDiff = yDown - yUp;
            var yDiffAcc = yDiff - imgmg[1];
            
            if (zoomLevel == 1){
                if ( Math.abs( xDiff ) > Math.abs( yDiff ) ) {/*most significant*/
                    if ( xDiff > 0 ) {
                        /* right swipe */ 
                        nextImage();
                    } else {
                        /* left swipe */
                        previousImage();
                    }                       
                } else {
                    if ( yDiff > 0 ) {
                        /* down swipe */ 
                    } else { 
                        /* up swipe */
    
                    }                                                                 
                }
            }else{
                MoveImage(-xDiffAcc, -yDiffAcc);
            }
            

            /* reset values */
            if (zoomLevel == 1){
                xDown = null;
                yDown = null;
            }else{
                xDown = xUp;
                yDown = yUp;
            }
                              
        };

        function isZoomed(){
            return window.matchMedia('(max--moz-device-pixel-ratio:0.99), (min--moz-device-pixel-ratio:1.01)').matches;
        }

    </script>
</body>

</html>